/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package net.etrs.formathlon.vue.jsf.form.visitor;

import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import net.etrs.formathlon.entity.formation.Session;
import net.etrs.formathlon.entity.utilisateur.Personnel;
import net.etrs.formathlon.metier.exception.MetierException;
import net.etrs.formathlon.metier.service.EntiteManager.NiveauHierarchique;
import net.etrs.formathlon.persistance.formation.InscriptionFacade;
import net.etrs.formathlon.persistance.formation.SessionFacade;
import net.etrs.formathlon.persistance.utilisateur.PersonnelFacade;
import net.etrs.formathlon.vue.exception.VueException;
import net.etrs.formathlon.vue.jsf.utils.GeneralBean;

/**
 * ManageBean JSF pour les pages traitant de l'administration des sessions.
 * @author OPIF
 */
@ManagedBean
@ViewScoped
public class VisitorSessionBean extends GeneralBean {

    //private FormationFacade formationFacade;
    @EJB
    private SessionFacade sessionFacade;
    @EJB
    private InscriptionFacade inscriptionFacade;
    @EJB
    private PersonnelFacade personnelFacade;
    private List<Session> listSession = new ArrayList<Session>();
    private Session session;
    private Personnel personnel;

    /** Creates a new instance of VisitorSessionBean */
    public VisitorSessionBean() {
    }

    /**
     * Methode d'initialisation.
     */
    @PostConstruct
    public void init() {
        listSession = sessionFacade.getSessionOuvertes();
    }

    /**
     * @return the listSession
     */
    public List<Session> getListSession() {
        return listSession;
    }

    /**
     * active le lien d'une inscription en vérifiant si la personne 
     * est connectée et sa fonction.
     * @return vrai ou faux
     */
    public boolean activerLienInscription() {
        if (getLoginControler().isUtilisateur()) {
            return true;
        }
        return false;
    }

    /**
     * Permet d'ouvrir un popup.
     */
    public void ouvrirPopupInscription(Session session) {
        this.session = session;
        getPopupBean().open(getMessage("application.visitorSessionBean.creer"));
    }

    /**
     * @return the session
     */
    public Session getSession() {
        return session;
    }

    /**
     * @return the personnel
     */
    public Personnel getPersonnel() {
        return personnel;
    }

    /**
     * inscription d un personnel a une session.
     */
    public void inscrire() {

        try {
            inscriptionFacade.inscrire(personnel, session, getLoginControler().isChefCours());
            displayMessage(String.format("%s a été inscrit.", personnel));
        } catch (MetierException ex) {
            Logger.getLogger(VisitorSessionBean.class.getName()).log(Level.SEVERE, null, ex);
            displayAlert(ex.getMessage());
        }

    }

    /**
     * Action d'annuler.
     */
    public void annuler() {
    }

    /**
     * Permet de recuperer le personnel connecté et la liste de personnels
     * subordonnés s'il y en a.
     * @return une liste de personnel
     * @throws VueException 
     */
    public List<Personnel> getListPersonnelSubordonne() throws VueException, MetierException {
        if (getLoginControler().getUtilisateurConnecte() != null) {

            List<Personnel> listPersonnel = new ArrayList<Personnel>();
            if (getLoginControler().isChefCours()) {
                try {
                    listPersonnel = personnelFacade.getSubordonnes(getLoginControler().getUtilisateurConnecte().getEntite(), NiveauHierarchique.COURS);
                } catch (MetierException mex) {
                    Logger.getLogger(VisitorPlanningBean.class.getCanonicalName()).log(Level.SEVERE, null, mex);
                }
            } else {
                listPersonnel.add(getLoginControler().getUtilisateurConnecte().getPersonnel());
            }
            return listPersonnel;
        }
        return new ArrayList<Personnel>();
    }

    /**
     * @param personnel the personnel to set
     */
    public void setPersonnel(Personnel personnel) {
        this.personnel = personnel;
    }
}
